<?php
namespace app\controller;

use app\BaseController;
use think\App;
use think\cache\driver\Redis;
use think\facade\Db;

class Kill extends BaseController
{
    private $redis;
    public function __construct(App $app)
    {
        $this->redis = new Redis();


        parent::__construct($app);
    }

    // 将商品库存存入队列
    public function killinit(){
        $store=50; // 库存50
        $redis=$this->redis; //接入redis
        $redis->del('goods_store'); // 删除库存列表
        $res=$redis->llen('goods_store'); //返回库存长度，这里已经是0
        $count=$store-$res;
        for($i=0;$i<$count;$i++){
            $redis->lpush('goods_store',1); //列表推进50个，模拟50个商品库存
        }
    }
    ///秒杀入口
    public function kill(){
        $id = input("id")?:1; //商品编号
        if(!$id)
            return $this->insertlog(0);//记录失败日志
        $redis = $this->redis; // 接入redis
        $count=$redis->lpop('goods_store'); //减少库存，返回剩余库存数
        if(!$count){ //库存为0
            $this->insertlog(0); //记录秒杀失败的 日志
            return false;
        }else{// 有库存
            $ordersn = $this->build_order_no(); //订单号随机生成
            $uid = rand(0,9999); //用户id随机生成，正式项目可以启用登录的session
            $status = 1; // 订单状态
            $data = Db::name("goods")->field("count,amount")->where("id",$id)->find();//查找商品
            if(!$data)
                return $this->insertlog(0); //商品不存在
            $result = Db::name("order")->insert(["order_sn"=>$ordersn,"user_id"=>$uid,"goods_id"=>$id,"price"=>$data['amount'],"status"=>$status,'addtime'=>date('Y-m-d H:i:s')]); //订单入库
            $res = Db::name("goods")->where("id",$id)->where("count",'>',0)->dec("count")->update(); //库存减少
            if($res)
                $this->insertlog(); //记录成功的日志
            else
                $this->insertlog(0);//记录失败的日志

        }

    }



    //生成唯一订单
    function build_order_no(){
        return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    }



    // 记录日志 状态1成功 0失败
    function insertlog($status=1){
        return Db::name("log")->insertGetId(["count"=>1,"status"=>$status,"addtime"=>date('Y-m-d H:i:s')]);
    }
}
